package LeetCodeQuestionBank;

/**
 * 283. 移动零
 * 给定一个数组 nums，编写一个函数将所有 0 移动到数组的末尾，同时保持非零元素的相对顺序。
 * <p>
 * 请注意 ，必须在不复制数组的情况下原地对数组进行操作。
 * <p>
 * <p>
 * <p>
 * 示例 1:
 * <p>
 * 输入: nums = [0,1,0,3,12]
 * 输出: [1,3,12,0,0]
 * 示例 2:
 * <p>
 * 输入: nums = [0]
 * 输出: [0]
 * <p>
 * <p>
 * 提示:
 * <p>
 * 1 <= nums.length <= 104
 * -231 <= nums[i] <= 231 - 1
 * <p>
 * <p>
 * 进阶：你能尽量减少完成的操作次数吗？
 */
public class T283 {

    public static void main(String[] args) {
        T283 t283 = new T283();
        t283.moveZeroes(new int[]{0, 1, 0, 3, 12});
    }

    public void moveZeroes(int[] nums) {

        //定义两个指针 一个指向已经移动完成的部分的尾部 一个指向尚未操作部分的头部


        int left = 0;

        int right = 0;

        while (right < nums.length) {
            // 右指针 遇到非0的数 直接赋值给左指针 遇到0 直接跳过 直到到达队尾
            if (nums[right] != 0) {
                nums[left] = nums[right];
                right++;
                left++;
            } else {
                right++;
            }

        }
        // 因为右指针 遇到0  就跳过 所以右指针比左指针跑的快 ，当右指针到达队尾时 做指针也把非零的数都按照顺序放置好了 剩下的都是0
        while (left < nums.length) {

            nums[left] = 0;
            left++;

        }


    }


}
